#pragma once
#include <iostream>
#include<deque>
#include<list>
using namespace std;

namespace ZWY

{
    template<class T, class Con = deque<T>>

    class stack

    {

    public:

        stack()
        {

        }

        void push(const T& x)
        {
            _c.push_back(x);
        }

        void pop()
        {
            _c.pop_back();
        }

        T& top()
        {
            return _c.back();
        }

        const T& top()const
        {
            return _c.back();
        }

        size_t size()const
        {
            return _c.size();
        }

        bool empty()const
        {
            return _c.empty(); 
        }

        /*typename Con::iterator begin()
        {
            return _c.begin();
        }

        typename Con::iterator end()
        {
            return _c.end();
        }*/
    private:

        Con _c;

    };


    /*template< class T >
    void Print(T m)
    {
        iterator it = m.begin();
        while (it != m.end())
        {
            cout << *it << " " << endl;
            it++;
        }
        cout << endl;
    }*/

    template<class t, class con = deque<t>>

    class queue

    {

    public:

        queue()
        {

        }

        void push(const t& x)
        {
            _c.push_front(x);
        }

        void pop()
        {
            _c.pop_back();
        }

        t& back()
        {
            return _c.back();
        }

        const t& back()const
        {
            return _c.back();
        }

        t& front()
        {
            return _c.front();
        }

        const t& front()const
        {
            return _c.front();
        }

        size_t size()const
        {
            return _c.size();
        }

        bool empty()const
        {
            return _c.empty();
        }

    private:

        con _c;

    };

};